/**
 * Create a basic component with common options
 */
import '../../locale'
import { isFunction } from '..'
import { camelize } from '../format/string'
import { SlotsMixin } from '../../mixins/slots'

function install(Vue) {
  var name = this.name
  Vue.component(name, this)
  Vue.component(camelize('-' + name), this)
} // unify slots & scopedSlots

export function unifySlots(context) {
  // use data.scopedSlots in lower Vue version
  var scopedSlots = context.scopedSlots || context.data.scopedSlots || {}
  var slots = context.slots()
  Object.keys(slots).forEach(function(key) {
    if (!scopedSlots[key]) {
      scopedSlots[key] = function() {
        return slots[key]
      }
    }
  })
  return scopedSlots
} // should be removed after Vue 3

function transformFunctionComponent(pure) {
  return {
    functional: true,
    props: pure.props,
    model: pure.model,
    render: function render(h, context) {
      return pure(h, context.props, unifySlots(context), context)
    }
  }
}

export function createComponent(name) {
  return function(sfc) {
    if (isFunction(sfc)) {
      sfc = transformFunctionComponent(sfc)
    }

    if (!sfc.functional) {
      sfc.mixins = sfc.mixins || []
      sfc.mixins.push(SlotsMixin)
    }

    sfc.name = name
    sfc.install = install
    return sfc
  }
}
